package com.yuw.ch2.opt;

public class Test01 {

	public static void main(String[] args) {
		// test01();
		// test021();
		// test03();
		test04();
	}

	/**
	 * 自增自减运算一些特殊情况展示
	 */
	private static void test04() {
		int i = 1;
		int j = 1;
		int k = (i++) + j; // ++ -- 是从右往左结合
		System.out.println("k=" + k);
		int k1 = i + (++j);
		System.out.println("k1=" + k1);

		System.out.println("========================");
		i = 1;
		i = i++; // i++ 表达式是1 i的值变为2
		/*
		 * 因为都是变量i在进行计算，计算过程： 1、先计算表达式 i++ 的值为1，将该表达式的值存入一个临时变量中； 2、因为运行了 表达式
		 * i++，所有i的值变为2； 第1、2步在执行表达式 i++的值； 3、因为还有一步 = 赋值运算，需要将表达式 i++的值赋值给变量i，
		 * 将第1步中缓存在临时变量中表达式 i++的值，赋值运算给变量i， 这是，变量i的值有重新赋值为1.
		 * 
		 */
		System.out.println("i=" + i);
		System.out.println("===================");
		/*
		 * 原则：代码的编译执行时从左往右执行的；
		 */
		i = 1;
		i += i++; // 表达式 i++ 参与运算，代码执行时从左往右进行
		System.out.println("i=" + i); // 2
		// 等价于
		i = 1;
		i = i + i++;
		/*
		 * 解析：程序是从左往右执行的；
		 * =右边，第一个i解析时的值为1； 
		 *       继续执行，i++表达式的值为1，表达式执行完后变量i的值为2，但是不会更新上一步解析的变量i的值
		 */
		System.out.println("i=" + i); // 2
		i = 1;
		i = i++ + i;
		/*
		 * 同理，推测
		 * =号右边表达式的值，i++为1，然后变量i的值为2；
		 *        继续执行，解析加号后面的i，此时i的值为2
		 */
		System.out.println("i=" + i); // 3 
	}

	/**
	 * 逻辑运算
	 */
	private static void test03() {
		// 定义变量
		int i0 = 0;
		int i1 = 1;
		int i2 = 2;

		boolean isOk1 = ++i0 > i1++ && ++i1 > i2; // false i0=1; i1=2 i2=2
													// 发生逻辑与短路
		System.out.println("isOk1=" + isOk1);
		System.out.println("i0=" + i0 + ",i1=" + i1 + ",i2=" + i2); // 发生了逻辑短路
		System.out.println("===========================");
		// 重新初始化赋值
		i0 = 0;
		i1 = 1;
		i2 = 2;
		// 或短路
		boolean isOk2 = ++i0 >= i1++ || ++i1 > i2; // true i0=1; i1=2 i2=2
													// 发生逻辑或短路
		System.out.println("isOk2=" + isOk2);
		System.out.println("i0=" + i0 + ",i1=" + i1 + ",i2=" + i2); // 发生了逻辑短路

		System.out.println("===========================");
		i0 = 0;
		i1 = 1;
		i2 = 2;
		int i3 = 4;
		int i4 = 5;
		// 1+1+1+1+1+2+3+3*4+4*5 从左往右开始执行
		// 混合逻辑短路 F T T T(发生短路)
		boolean isOk3 = ++i0 > i1++ || ++i1 > i2 && i4 > i3++ || ++i3 > i4++ || i4 > i3 && i3-- > --i4; // true
		// i0 =1 ,i1=3, i2 = 2,i3 =5 ,i4 = 5
		System.out.println("isOk3=" + isOk3);
		System.out.println("i0=" + i0 + ",i1=" + i1 + ",i2=" + i2 + ",i3=" + i3 + ",i4=" + i4); // 发生了逻辑短路
		// 从左往右
		boolean isOk4 = (++i0 > i1++ || ++i1 > i2) && i4 > i3++;
	}

	/**
	 * 位运算应用：不借助第三个变量，交换两个变量的值
	 */
	private static void test02() {
		int i = 2;
		int j = 3;
		System.out.println("交换前：i=" + i + ",j=" + j);
		// 交换两个变量的值
		i ^= j;
		j ^= i;
		i ^= j;
		System.out.println("交换后：i=" + i + ",j=" + j);
	}

	/**
	 * 位运算应用：借助第三个变量，交换两个变量的值
	 */
	private static void test021() {
		int i = 2;
		int j = 3;
		System.out.println("交换前：i=" + i + ",j=" + j);
		// 交换两个变量的值
		// 定义一个临时变量
		int temp = i;
		i = j;
		j = temp;
		System.out.println("交换后：i=" + i + ",j=" + j);
	}

	/**
	 * 位移运算
	 */
	private static void test01() {
		// 定义一个变量
		int iVal10 = 3;
		int iVal20 = 128;

		// 左移运算
		int iVal11 = iVal10 << 3;// 等价于 iVal*2的3次方 24
		System.out.println("iVal10<<3:" + iVal11);
		// 右移运算
		int iVal21 = iVal20 >> 3; // 等价于 iVal21/2的3次方
		System.out.println("iVal20>>3:" + iVal21);

	}

}
